home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 10, No. 03 (1989-03)(MicroSPARC)(Side A).zip
/
Nibble Volume 10, No. 03 (1989-03)(MicroSPARC)(Side A).po
/
VISIT.MON.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
13KB
|
411 lines
********************************
* *
* Visit Monitor CDA (ROM 01) *
* *
* Interpreted by *
* Sandy Mossberg *
* *
* Copyright (C) 1988 *
* by MicroSPARC, Inc. *
* Concord, MA 01742 *
* *
* Merlin-16 Assembler *
* *
********************************
TR ON
TTL "Visit Monitor CDA"
* General Equates:
PTR = $06 ;pointer (2-byte or 4-byte)
CH = $24 ;column position
CV = $25 ;row position
USRADR = $3F8 ;user CTL-Y vector
INITSLOT3 = $C300 ;init slot 3 ROM
PRBL2 = $F94A ;print X spaces
INIT = $FB2F ;init text screen
VTAB = $FC22 ;set vertical tab
HOME = $FC58 ;clear screen and home cursor
COUT = $FDED ;output char via CSW hook
COUT1 = $FDF0 ;output char directly
SETNORM = $FE84 ;set normal text mode
SETKBD = $FE89 ;set standard keyboard input
SETVID = $FE93 ;set standard screen output
MONZ = $FF69 ;standard monitor entry
MONZ2 = $FF6C ;alternate monitor entry
MSGPOINTER = $E100C0 ;ptr to Message Address Table
MP_Install = $FF1800 ;install Memory Peeker CDA
* Soft Switches:
SETSLOTCXROM = $C006 ;enable slot ROM
SETINTCXROM = $C007 ;enable internal ROM
CYAREG = $C036 ;speed/motor register
STATEREG = $C068 ;state register
* Direct Page (used for vectoring):
To_MON = $F7 ;enter monitor
To_CDA = $FB ;reenter CDA
*===============================
* Supporting Subroutines for CDA:
*-------------------------------
* Set Fast System Speed:
*-------------------------------
ORG $FFA1AB
SetFast SEP %00110000 ;set m,x flags
XBA ;save accum LSB (in accum MSB)
LDA #$80 ;turn on fast
TSB CYAREG ; system speed
XBA ;restore original accum LSB
STA SETINTCXROM ;use internal ROM
RTS
*-------------------------------
* Execute System Monitor Subroutine:
*-------------------------------
ORG $FFA932
* ENTRY:| address-1 of monitor subroutine on stack +1/+2
* | address+2 of caller on stack +3/+4
*
* EXECUTION | 1. SetEmulate subroutine (RTL from DoF8MonSub)
* SEQUENCE: | 2. Monitor subroutine (RTS from SetEmulate)
* | 3. SetNative subroutine (RTS from monitor subr)
* | 4. SetFast subroutine (RTL from SetNative)
* | 5. Return to caller+3 (RTS from SetFast)
DoF8MonSub XBA ;save entry accum LSB
TXA ;save entry X-reg
REP %00110000 ;clear m,x flags
PLX ;get entry subroutine addr-1
PHK ;put 3-byte address
PEA SetFast-1 ; of SetFast on stack
PEA SetNative-1 ;2-byte SetNative on stack
PHX ;2-byte monitor subroutine on stack
SEP %00110000 ;set m,x flags
TAX ;restore X-reg
XBA ;restore accum LSB
DoMonSub1 XBA ;save accum LSB
JSR SetSpeed ;set speed
XBA ;restore accum LSB
PHB ;put 3-byte address
PEA SetEmulate-1 ; of SetEmulate on stack
STA SETSLOTCXROM ;kick in peripheral ROM
RTL ;let the executions commence
*-------------------------------
* Set and Execute System Monitor Subroutines:
*-------------------------------
* EXIT:| address-1 of monitor subroutine on stack +1/+2
* | address+2 of caller on stack +3/+4
*
* Starred monitor subroutines used by CDA or supporting code:
DoPRBLNK LDX #$03
DoPRBL2 PEA PRBL2-1
BRA DoF8MonSub
DoCROUT LDA #$8D
DoCOUT PEA COUT-1 ;***
BRA DoF8MonSub
DoCOUT1 PEA COUT1-1
BRA DoF8MonSub
DoMONZ2 PEA MONZ2-1
BRA DoMonSub1
SetCHCV STX CH
STY CV
DoVTAB PEA VTAB-1
BRA DoF8MonSub
DoINITSLOT3 PEA INITSLOT3-1
BRA DoF8MonSub
DoHOME PEA HOME-1 ;***
BRA DoF8MonSub
DoSet40IO PEA SetIO40-1
BRA DoF8MonSub
*===============================
* Unsupporting Subroutines Adjacent to CDA:
*-------------------------------
* Initialize Slot 3 I/O:
*-------------------------------
InitSlot3 LDA #$98 ;unprintable char
JSR DoINITSLOT3 ;init slot 3
LDA #$00
STAL $E10136 ;clear flag (?)
RTS
*-------------------------------
* Copy Alternate Text Page:
*-------------------------------
CopyAltPage LDA #$01 ;flag saving of alternate
STAL $E10174 ; text page ($800-$BFF)
REP %00110000 ;clear m,x flags
LDX #$0800 ;start of move
TXY ;destination of move
LDA #$03FF ;$400 bytes to move
MVN $00,$E00000 ;move from bank $00 to bank $E0
RTL
*===============================
* CDA Installation Code:
*-------------------------------
CDA_Install LDAL $E1017D ;check CDA installed flag
ASL
BMI CDAIn ;CDAs already installed
REP %00110000 ;clear m,x flags
PEA ^VM_Handle ;handle to CDA
PEA VM_Handle
LDX #$0F05 ;InstallCDA call
JSL $E10000 ; (Visit Monitor)
JSL MP_Install ;Install Memory Peeker CDA
SEP %00110000 ;set m,x flags
CDAIn LDA #$C0 ;set CDA installed
STAL $E1017D ; flag
RTS
*===============================
* CDA Handle:
*-------------------------------
VM_Handle ADRL VM_Header ;handle to CDA header
*=============================== ---> START OF CDA CODE <---
* CDA Header:
*-------------------------------
VM_Header STR "Visit Monitor" ;title string
ADRL VM_Startup ;ptr to startup code
ADRL VM_Shutdown ;ptr to shutdown code
*===============================
* Main CDA Code:
*-------------------------------
* ENTER MONITOR:
*-------------------------------
* Address data in bank zero:
VM_Startup SEP %00110000 ;set m,x flags
SEI ;disable IRQ interrupts
PEA $0000 ;set data bank
PLB ; equal to zero
PLB ;set stack right
* Save existing CTL-Y vector (bank zero):
LDX #$02 ;index 3 bytes
SaveCTLY LDA USRADR,X ;get original vector byte
PHA ;save on stack
DEX
BPL SaveCTLY ;back for another byte
* Set CDA's CTL-Y vector in page 3 (bank zero):
LDA #$4C ;vector: JMP $00FB
STA USRADR
LDA #To_CDA
STA USRADR+1
STZ USRADR+2
* Save existing direct page code ($F7-$FF):
LDX #$08 ;index 9 bytes
SaveZP LDA To_MON,X ;get original direct page byte
PHA ;save on stack
DEX
BPL SaveZP ;back for another byte
* Stuff vectoring code into direct page:
PHB ;save data bank (=0)
PHK ;equate program bank
PLB ; and data bank
LDX #$08 ;index 9 bytes
SetZP LDA BZ_Code,X ;get our vectoring code and
STA To_MON,X ; stuff into direct page
DEX
BPL SetZP ;back for another byte
PLB ;restore data bank (=0)
PHK ;modify direct page return address
PLA ; by stuffing current program
STA To_CDA+4 ; bank into return vector
* Print instructions on screen:
LDA STATEREG ;save state register
PHA ; on stack
JSR DoHOME ;clear screen and home cursor
LDA #$FD ;print message
JSR PrintMsg ; on screen
PLA ;restore entry
STA STATEREG ; state register
* Enter monitor:
SEC ;set emulation
XCE ; mode
JML To_MON ;enter monitor via direct page
*-------------------------------
* RETURN FROM MONITOR:
*-------------------------------
VM_Return PLA ;remove monitor subroutine
PLA ; return address from stack
PEA $0000 ;set data bank
PLB ; equal to zero
PLB ;set stack right
CLC ;set native
XCE ; mode
CLI ;enable interrupts
* Restore original direct page code ($F7-$FF):
LDX #$00
RestoreZP PLA ;get original direct page byte
STA To_MON,X ;restore direct page byte
Restore INX
CPX #$09 ;get 10 bytes
BCC RestoreZP ;back for another direct page byte
PLA
STA USRADR-9,X ;restore CTL-Y vector
CPX #$0B ;get 3 ($0B-$09+1) CTL-Y bytes
BCC Restore ;back for another byte
REP %00110000 ;clear m,x flags
VM_Shutdown RTL ;exit CDA
*-------------------------------
* VECTORING CODE COPIED TO DIRECT PAGE:
*-------------------------------
VM_RETURN = $AA2A
* Direct page locations in parentheses:
BZ_Code CLI ;enable interrupts ($F7)
JMP MONZ ;enter monitor ($F8-$FA)
SEI ;disable interrupts ($FB)
JML VM_RETURN ;return to CDA ($FC-$FF)
;bank byte modified by CDA
;---> END OF CDA CODE <---
*===============================
* Print Message:
*-------------------------------
* MAT = Message Address Table (254 2-byte pointers to messages)
* MTT = Message Text Table (text of messages)
*
* ENTRY:| A-reg holds offset in MAT
ORG $FFC080
* Set pointer to desired message:
PrintMsg REP %00110000 ;clear m,x flags
AND #$00FF ;isolate MAT offset
LDY PTR ;save direct page locations $06-$09
PHY
LDY PTR+2
PHY
ASL ;double index to 2-byte entries
TAY ; in MAT and transfer to Y-reg
LDAL MSGPOINTER ;set ptr to MAT
STA PTR
LDAL MSGPOINTER+1
STA PTR+1
LDA [PTR],Y ;set ptr to MTT
STA PTR
* Print individual characters:
SEP %01110000 ;set m,x,v flags
LDA [PTR] ;get 1st char in message
BEQ BumpPtr ;zero keeps v-set for MouseText
CMP #$20
BCC Repeat ;repeat signal encountered
CLV ;v-clear signals no MouseText
NextChar LDA [PTR] ;get char in message
BEQ EndMsg ;end of message
CMP #$20
BCC Repeat ;repeat signal encountered
BVS CharOut ;allow MouseText
BMI CharOutEnd ;print last char in message
ORA #$80 ;disallow MouseText
CharOut PHP ;save status
JSR DoCOUT ;output char
PLP ;restore status
BumpPtr INC PTR ;point to next char
BNE NextChar
INC PTR+1
BRA NextChar
* End message:
CharOutEnd JSR DoCOUT ;output final char in message
EndMsg REP %00110000 ;clear m,x flags
PLA ;restore direct page locs $06-$09
STA PTR+2
PLA
STA PTR
SEP %00110000 ;set m,x flags
RTS ;return to caller
* Print repeat characters:
Repeat TAY ;Y-reg holds repeat count
INC PTR ;point to next char
BNE RepeatChar
INC PTR+1
RepeatChar LDA [PTR] ;get char to repeat
PHY ;save counter
BVS RepeatOut ;allow MouseText
ORA #$80 ;disallow MouseText
RepeatOut PHP ;preserve status
JSR DoCOUT ;output repeat char
PLP ;restore status
PLY ;retrieve counter
DEY ;reduce count
BNE RepeatChar ;more chars to repeat
BRA BumpPtr ;exit repeat loop
*===============================
* F8 System Monitor Subroutines (Unsupported Entry Points):
*-------------------------------
* Set Emulation Mode:
*-------------------------------
ORG $FFF8B5
SetEmulate PHP ;save entry status
SEC ;set emulation
XCE ; mode
PLP ;restore status
RTS
*-------------------------------
* Set Native Mode:
*-------------------------------
ORG $FFF8D4
SetNative PHP ;save entry status
CLC ;set native
XCE ; mode
PLP ;restore status
RTL
*-------------------------------
* Set Standard I/O:
*-------------------------------
ORG $FFFE43
SetIO40 JSR SETNORM ;set normal text mode
JSR INIT ;init text screen
JSR SETVID ;set standard keyboard input
JSR SETKBD ;set standard keyboard output
*-------------------------------
* Set System Speed:
*-------------------------------
ORG $FFFFD6
SetSpeed LDA CYAREG ;get speed/motor reg
AND #$7F ;clear speed bit
ORAL $E10137 ;use speed flag to
STA CYAREG ; clear/set speed reg
RTS
LST OFF